这段代码是Haru Free PDF Library中关于PDF文档（Document）的头文件 `hpdf_doc.h`。它定义了PDF文档操作相关的数据结构、函数原型和宏。以下是对代码的详细解释：

1. **版权声明**：注释块提供了Haru PDF库的版权信息。

2. **宏定义**：
   - `HPDF_SIG_BYTES`：定义了PDF文档对象的签名。

3. **包含其他头文件**：
   - 包含了其他PDF对象定义的头文件，如 `hpdf_catalog.h`、`hpdf_image.h`、`hpdf_pages.h`、`hpdf_outline.h` 和 `hpdf_ext_gstate.h`。

4. **C++兼容性**：条件编译指令，确保当使用C++编译器时，这些函数以C的方式进行链接。

5. **默认PDF版本宏定义**：
   - `HPDF_VER_DEFAULT`：定义了默认的PDF版本，这里为 `HPDF_VER_12`。

6. **PDF文档结构体定义**：
   - `_HPDF_Doc_Rec` 结构体定义了PDF文档的内部结构，包括内存管理器、目录、大纲、交叉引用表、页面树、当前页面、错误记录、文档信息字典、尾记录等。

7. **文档操作函数原型**：
   - `HPDF_Doc_FindEncoder`：在文档中查找编码器。
   - `HPDF_Doc_FindFontDef`：在文档中查找字体定义。
   - `HPDF_Doc_FindFont`：在文档中查找字体。
   - `HPDF_Doc_Validate`：验证PDF文档对象的有效性。

8. **页面处理函数原型**：
   - `HPDF_Doc_GetCurrentPages`：获取文档的当前页面集合。
   - `HPDF_Doc_AddPagesTo`：将页面集合添加到指定的父页面。
   - `HPDF_Doc_SetCurrentPages`：设置文档的当前页面集合。
   - `HPDF_Doc_SetCurrentPage`：设置文档的当前页面。

9. **字体处理函数原型**：
   - `HPDF_GetFontDef`：获取字体定义。
   - `HPDF_Doc_RegisterFontDef`：在文档中注册字体定义。

10. **编码处理函数原型**：
    - `HPDF_Doc_RegisterEncoder`：在文档中注册编码器。

11. **加密处理函数原型**：
    - `HPDF_Doc_SetEncryptOn`：开启文档加密。
    - `HPDF_Doc_SetEncryptOff`：关闭文档加密。
    - `HPDF_Doc_PrepareEncryption`：准备文档加密。

12. **结束C++兼容性条件编译**：`#ifdef __cplusplus` 和 `#endif /* __cplusplus */` 结束C++兼容性代码块。

13. **结束宏定义**：`#endif /* _HPDF_DOC_H */` 结束头文件的宏定义。

这个头文件提供了创建和操作PDF文档的功能，包括文档的页面管理、字体和编码查找与注册、文档加密等。通过这些函数，开发者可以构建和管理PDF文档的结构，以及对文档内容进行加密保护。/*
 * << Haru Free PDF Library >> -- hpdf_doc.h
 *
 * URL: http://libharu.org
 *
 * Copyright (c) 1999-2006 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp>
 * Copyright (c) 2007-2009 Antony Dovgal <tony@daylessday.org>
 *
 * Permission to use, copy, modify, distribute and sell this software
 * and its documentation for any purpose is hereby granted without fee,
 * provided that the above copyright notice appear in all copies and
 * that both that copyright notice and this permission notice appear
 * in supporting documentation.
 * It is provided "as is" without express or implied warranty.
 *
 */


#ifndef _HPDF_DOC_H
#define _HPDF_DOC_H

#define HPDF_SIG_BYTES 0x41504446L

#include "hpdf_catalog.h"
#include "hpdf_image.h"
#include "hpdf_pages.h"
#include "hpdf_outline.h"
#include "hpdf_ext_gstate.h"

#ifdef __cplusplus
extern "C" {
#endif

#define HPDF_VER_DEFAULT  HPDF_VER_12

typedef struct _HPDF_Doc_Rec {
    HPDF_UINT32     sig_bytes;
    HPDF_PDFVer     pdf_version;

    HPDF_MMgr         mmgr;
    HPDF_Catalog      catalog;
    HPDF_Outline      outlines;
    HPDF_Xref         xref;
    HPDF_Pages        root_pages;
    HPDF_Pages        cur_pages;
    HPDF_Page         cur_page;
    HPDF_List         page_list;
    HPDF_Error_Rec    error;
    HPDF_Dict         info;
    HPDF_Dict         trailer;

    HPDF_List         font_mgr;
    HPDF_BYTE         ttfont_tag[6];

    /* list for loaded fontdefs */
    HPDF_List         fontdef_list;

    /* list for loaded encodings */
    HPDF_List         encoder_list;

    HPDF_Encoder      cur_encoder;

    /* default compression mode */
    HPDF_BOOL         compression_mode;

    HPDF_BOOL         encrypt_on;
    HPDF_EncryptDict  encrypt_dict;

    HPDF_Encoder      def_encoder;

    HPDF_UINT         page_per_pages;
    HPDF_UINT         cur_page_num;

    /* buffer for saving into memory stream */
    HPDF_Stream       stream;
} HPDF_Doc_Rec;

typedef struct _HPDF_Doc_Rec  *HPDF_Doc;


HPDF_Encoder
HPDF_Doc_FindEncoder (HPDF_Doc         pdf,
                      const char  *encoding_name);


HPDF_FontDef
HPDF_Doc_FindFontDef (HPDF_Doc         pdf,
                      const char  *font_name);


HPDF_Font
HPDF_Doc_FindFont  (HPDF_Doc         pdf,
                    const char  *font_name,
                    const char  *encoding_name);


HPDF_BOOL
HPDF_Doc_Validate  (HPDF_Doc  pdf);


/*----- page handling -------------------------------------------------------*/

HPDF_Pages
HPDF_Doc_GetCurrentPages  (HPDF_Doc  pdf);


HPDF_Pages
HPDF_Doc_AddPagesTo  (HPDF_Doc     pdf,
                      HPDF_Pages   parent);


HPDF_STATUS
HPDF_Doc_SetCurrentPages  (HPDF_Doc    pdf,
                           HPDF_Pages  pages);


HPDF_STATUS
HPDF_Doc_SetCurrentPage  (HPDF_Doc   pdf,
                          HPDF_Page  page);




/*----- font handling -------------------------------------------------------*/

HPDF_FontDef
HPDF_GetFontDef (HPDF_Doc         pdf,
                 const char  *font_name);


HPDF_STATUS
HPDF_Doc_RegisterFontDef  (HPDF_Doc       pdf,
                           HPDF_FontDef   fontdef);


/*----- encoding handling ---------------------------------------------------*/

HPDF_STATUS
HPDF_Doc_RegisterEncoder  (HPDF_Doc       pdf,
                           HPDF_Encoder   encoder);



/*----- encryptio------------------------------------------------------------*/

HPDF_STATUS
HPDF_Doc_SetEncryptOn (HPDF_Doc  pdf);


HPDF_STATUS
HPDF_Doc_SetEncryptOff (HPDF_Doc  pdf);


HPDF_STATUS
HPDF_Doc_PrepareEncryption (HPDF_Doc  pdf);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* _HPDF_DOC_H */

